﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Свойство("ВидСвойств") Тогда
		ВидСвойств = Параметры.ВидСвойств;
		Элементы.ВидСвойств.Видимость = Ложь;
		Если ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеРеквизиты Тогда
			Ключ = "НаборыДополнительныхРеквизитов";
		ИначеЕсли ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеСведения Тогда
			Ключ = "НаборыДополнительныхСведений";
		ИначеЕсли ВидСвойств = Перечисления.ВидыСвойств.Метки Тогда
			Ключ = "НаборыМеток";
		КонецЕсли;
	Иначе
		ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеРеквизиты;
		Ключ = "НаборыДополнительныхРеквизитов";
	КонецЕсли;
	СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, Ключ);
	
	ЦветФормы = Элементы.Свойства.ЦветФона;
	
	НастроитьОтображениеНаборов();
	ОформитьНаборыИСвойства();
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда
		Элементы.ПоискИУдалениеДублей.Видимость = Ложь;
	КонецЕсли;
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.НаборыСвойств.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни;
		Элементы.НаборыСвойств.ПоложениеЗаголовка         = ПоложениеЗаголовкаЭлементаФормы.Верх;
		Элементы.Свойства.ПоложениеЗаголовка              = ПоложениеЗаголовкаЭлементаФормы.Верх;
		Элементы.СвойстваПодменюДобавить.Отображение      = ОтображениеКнопки.Картинка;
	КонецЕсли;
	
	СуффиксТекущегоЯзыка = ОбщегоНазначения.СуффиксЯзыкаТекущегоПользователя();
	
	Если СуффиксТекущегоЯзыка = Неопределено Тогда
		
		СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
		
		СвойстваСписка.ТекстЗапроса = СтрЗаменить(НаборыСвойств.ТекстЗапроса, "ГДЕ",
			"ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НаборыДополнительныхРеквизитовИСведений.Представления КАК НаборыПредставления
			|ПО (НаборыПредставления.Ссылка = НаборыПереопределяемый.Ссылка)
			|И (НаборыПредставления.КодЯзыка = &КодЯзыка)
			|ГДЕ");
			
		СвойстваСписка.ТекстЗапроса = СтрЗаменить(СвойстваСписка.ТекстЗапроса, "НаборыПереопределяемый.Наименование КАК Наименование",
			"НаборыПереопределяемый.Наименование КАК Наименование, НаборыПредставления.Наименование КАК НаименованиеНаДругихЯзыках");
		
		ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.НаборыСвойств, СвойстваСписка);
		
		ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(
			НаборыСвойств, "КодЯзыка", ТекущийЯзык().КодЯзыка, Истина);
		
	ИначеЕсли ЗначениеЗаполнено(СуффиксТекущегоЯзыка) Тогда
		
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
			МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер");
			МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект,, "НаборыСвойств");
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "Запись_ДополнительныеРеквизитыИСведения"
	 ИЛИ ИмяСобытия = "Запись_ЗначенияСвойствОбъектов"
	 ИЛИ ИмяСобытия = "Запись_ЗначенияСвойствОбъектовИерархия" Тогда
		
		// При записи свойства необходимо перенести свойство в соответствующую группу.
		// При записи значения необходимо обновить список первых 3-х значений.
		ПриИзмененииТекущегоНабораНаСервере();
		
	ИначеЕсли ИмяСобытия = "Переход_НаборыДополнительныхРеквизитовИСведений" Тогда
		// При открытии формы для редактирования состава свойств конкретного объекта метаданных
		// необходимо перейти к набору или группе наборов этого объекта метаданных.
		Если ТипЗнч(Параметр) = Тип("Структура") Тогда
			ВыбратьУказанныеСтроки(Параметр);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ВидСвойствПриИзменении(Элемент)
	
	НастроитьОтображениеНаборов();
	ОформитьНаборыИСвойства();
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьНеиспользуемыеРеквизитыПриИзменении(Элемент)
	ПереключитьСписокНаборов();
	ПриИзмененииТекущегоНабора();
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыНаборыСвойств

&НаКлиенте
Процедура НаборыСвойствПриАктивизацииСтроки(Элемент)
	
	ПодключитьОбработчикОжидания("ПриИзмененииТекущегоНабора", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура НаборыСвойствПередНачаломИзменения(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура НаборыСвойствПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	СтандартнаяОбработка = Ложь;
	
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Элементы.НаборыСвойств.ДанныеСтроки(Строка).ЭтоГруппа Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НаборыСвойствПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	СтандартнаяОбработка = Ложь;
	
	Если ПараметрыПеретаскивания.Значение.ОбщиеЗначения Тогда
		ПеретаскиваемыйЭлемент = ПараметрыПеретаскивания.Значение.ВладелецДополнительныхЗначений;
	Иначе
		ПеретаскиваемыйЭлемент = ПараметрыПеретаскивания.Значение.Свойство;
	КонецЕсли;
	
	Если ТипЗнч(ПеретаскиваемыйЭлемент) <> Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения") Тогда
		Возврат;
	КонецЕсли;
	
	НаборПриемник = Строка;
	ДобавитьРеквизитВНабор(ПеретаскиваемыйЭлемент, Строка);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура НаборыСвойствПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	
	Для Каждого СтрокаДинамическогоСписка Из Строки Цикл
		Данные = СтрокаДинамическогоСписка.Значение.Данные;
		Если Данные.ЭтоГруппа Тогда
			Данные.Представление = Строка(Данные.Ссылка);
			Продолжить;
		КонецЕсли;
		
		Если Данные.ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеСведения Тогда
			Если Не ЗначениеЗаполнено(Данные.КоличествоСведений) Тогда
				Данные.Представление = Строка(Данные.Ссылка);
				Продолжить;
			КонецЕсли;
			Если Данные.Свойство("НаименованиеНаДругихЯзыках") И ЗначениеЗаполнено(Данные.НаименованиеНаДругихЯзыках) Тогда
				Данные.Представление = Данные.НаименованиеНаДругихЯзыках + " (" + Данные.КоличествоСведений + ")";
				Продолжить;
			КонецЕсли;
			Данные.Представление = Строка(Данные.Ссылка) + " (" + Данные.КоличествоСведений + ")";
		ИначеЕсли Данные.ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеРеквизиты Тогда
			Если Не ЗначениеЗаполнено(Данные.КоличествоРеквизитов) Тогда
				Данные.Представление = Строка(Данные.Ссылка);
				Продолжить;
			КонецЕсли;
			Если Данные.Свойство("НаименованиеНаДругихЯзыках") И ЗначениеЗаполнено(Данные.НаименованиеНаДругихЯзыках) Тогда 
				Данные.Представление = Данные.НаименованиеНаДругихЯзыках + " (" + Данные.КоличествоРеквизитов + ")";
				Продолжить;
			КонецЕсли;
			Данные.Представление = Строка(Данные.Ссылка) + " (" + Данные.КоличествоРеквизитов + ")";
		ИначеЕсли Данные.ВидСвойств = Перечисления.ВидыСвойств.Метки Тогда
			Если Не ЗначениеЗаполнено(Данные.КоличествоМеток) Тогда
				Данные.Представление = Строка(Данные.Ссылка);
				Продолжить;
			КонецЕсли;
			Если Данные.Свойство("НаименованиеНаДругихЯзыках") И ЗначениеЗаполнено(Данные.НаименованиеНаДругихЯзыках) Тогда 
				Данные.Представление = Данные.НаименованиеНаДругихЯзыках + " (" + Данные.КоличествоРеквизитов + ")";
				Продолжить;
			КонецЕсли;
			Данные.Представление = Строка(Данные.Ссылка) + " (" + Данные.КоличествоМеток + ")";
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСвойства

&НаКлиенте
Процедура СвойстваПриАктивизацииСтроки(Элемент)
	
	СвойстваУстановитьДоступностьКоманд(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура СвойстваПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	
	Если Копирование Тогда
		Скопировать();
	Иначе
		Создать();
	КонецЕсли;
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура СвойстваПередНачаломИзменения(Элемент, Отказ)
	
	Изменить();
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура СвойстваПередУдалением(Элемент, Отказ)
	
	ИзменитьПометкуУдаления();
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура СвойстваОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда
		Если ВыбранноеЗначение.Свойство("ВладелецДополнительныхЗначений") Тогда
			
			ПараметрыФормы = Новый Структура;
			ПараметрыФормы.Вставить("ВидСвойств", ВидСвойств);
			ПараметрыФормы.Вставить("ТекущийНаборСвойств",            ТекущийНабор);
			ПараметрыФормы.Вставить("ВладелецДополнительныхЗначений", ВыбранноеЗначение.ВладелецДополнительныхЗначений);
			
			ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ФормаОбъекта",
				ПараметрыФормы, Элементы.Свойства);
			
		ИначеЕсли ВыбранноеЗначение.Свойство("ОбщееСвойство") Тогда
			
			ИзменяемыйНабор = ТекущийНабор;
			Если ВыбранноеЗначение.Свойство("Перетаскивание") Тогда
				ДобавитьОбщееСвойствоПеретаскиванием(ВыбранноеЗначение.ОбщееСвойство);
			Иначе
				ВыполнитьКомандуНаСервере("ДобавитьОбщееСвойство", ВыбранноеЗначение.ОбщееСвойство);
				ИзменяемыйНабор = НаборПриемник;
			КонецЕсли;
			
			Оповестить("Запись_НаборыДополнительныхРеквизитовИСведений",
				Новый Структура("Ссылка", ИзменяемыйНабор), ИзменяемыйНабор);
		Иначе
			ВыбратьУказанныеСтроки(ВыбранноеЗначение);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СвойстваПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура СвойстваНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
	// Перемещение свойств и реквизитов не поддерживается, всегда выполняется копирование.
	// Иконка курсора при этом должна быть соответствующая.
	ПараметрыПеретаскивания.ДопустимыеДействия = ДопустимыеДействияПеретаскивания.Копирование;
	ПараметрыПеретаскивания.Действие           = ДействиеПеретаскивания.Копирование;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Создать(Команда = Неопределено)
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("НаборСвойств", ТекущийНабор);
	ПараметрыФормы.Вставить("ВидСвойств", ВидСвойств);
	ПараметрыФормы.Вставить("ТекущийНаборСвойств", ТекущийНабор);
	
	ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ФормаОбъекта",
		ПараметрыФормы, Элементы.Свойства);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьИзНабора(Команда)
	
	ПараметрыФормы = Новый Структура;
	
	ВыбранныеЗначения = Новый Массив;
	НайденныеСтроки = Свойства.НайтиСтроки(Новый Структура("Общее", Истина));
	Для каждого Строка Из НайденныеСтроки Цикл
		ВыбранныеЗначения.Добавить(Строка.Свойство);
	КонецЦикла;
	
	Если Не ЗначениеЗаполнено(ВидСвойств) Тогда
		ПараметрыФормы.Вставить("ВыборОбщегоСвойства", Истина);
	Иначе
		ПараметрыФормы.Вставить("ВыборВладельцаДополнительныхЗначений", Истина);
	КонецЕсли;
	
	ПараметрыФормы.Вставить("ВыбранныеЗначения", ВыбранныеЗначения);
	ПараметрыФормы.Вставить("ВидСвойств", ВидСвойств);
	ПараметрыФормы.Вставить("ТекущийНаборСвойств", ТекущийНабор);
	
	ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ФормаОбъекта",
		ПараметрыФормы, Элементы.Свойства);
КонецПроцедуры

&НаКлиенте
Процедура Изменить(Команда = Неопределено)
	
	Если Элементы.Свойства.ТекущиеДанные <> Неопределено Тогда
		// Открытие формы свойства.
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы.Вставить("Ключ", Элементы.Свойства.ТекущиеДанные.Свойство);
		ПараметрыФормы.Вставить("ТекущийНаборСвойств", ТекущийНабор);
		
		ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ФормаОбъекта",
			ПараметрыФормы, Элементы.Свойства);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Скопировать(Команда = Неопределено, ВставкаИзБуфера = Ложь)
	
	ПараметрыФормы = Новый Структура;
	ЗначениеКопирования = Элементы.Свойства.ТекущиеДанные.Свойство;
	ПараметрыФормы.Вставить("ВладелецДополнительныхЗначений", ЗначениеКопирования);
	ПараметрыФормы.Вставить("ТекущийНаборСвойств", ТекущийНабор);
	ПараметрыФормы.Вставить("ЗначениеКопирования", ЗначениеКопирования);
	
	ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ФормаОбъекта", ПараметрыФормы);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРеквизитВНабор(ВладелецДополнительныхЗначений, Набор = Неопределено)
	
	ПараметрыФормы = Новый Структура;
	Если Набор = Неопределено Тогда
		ТекущийНаборСвойств = ТекущийНабор;
	Иначе
		ТекущийНаборСвойств = Набор;
		ПараметрыФормы.Вставить("Перетаскивание", Истина);
	КонецЕсли;
	
	ПараметрыФормы.Вставить("КопированиеСВопросом", Истина);
	ПараметрыФормы.Вставить("ВладелецДополнительныхЗначений", ВладелецДополнительныхЗначений);
	ПараметрыФормы.Вставить("ВидСвойств", ВидСвойств);
	ПараметрыФормы.Вставить("ТекущийНаборСвойств", ТекущийНаборСвойств);
	
	ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ФормаОбъекта", ПараметрыФормы, Элементы.Свойства);
	
КонецПроцедуры

&НаКлиенте
Процедура ПометитьНаУдаление(Команда)
	
	ИзменитьПометкуУдаления();
	
КонецПроцедуры

&НаКлиенте
Процедура ПереместитьВверх(Команда)
	
	ВыполнитьКомандуНаСервере("ПереместитьВверх");
	
КонецПроцедуры

&НаКлиенте
Процедура ПереместитьВниз(Команда)
	
	ВыполнитьКомандуНаСервере("ПереместитьВниз");
	
КонецПроцедуры

&НаКлиенте
Процедура ПоискИУдалениеДублей(Команда)
	МодульПоискИУдалениеДублейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПоискИУдалениеДублейКлиент");
	ИмяФормыПоискИУдалениеДублей = МодульПоискИУдалениеДублейКлиент.ИмяФормыОбработкиПоискИУдалениеДублей();
	ОткрытьФорму(ИмяФормыПоискИУдалениеДублей);
КонецПроцедуры

&НаКлиенте
Процедура СкопироватьВыделенныйРеквизит(Команда)
	КопируемыйРеквизит = Новый Структура;
	КопируемыйРеквизит.Вставить("КопируемыйРеквизит", Элементы.Свойства.ТекущиеДанные.Свойство);
	КопируемыйРеквизит.Вставить("ОбщиеЗначения", Элементы.Свойства.ТекущиеДанные.ОбщиеЗначения);
	КопируемыйРеквизит.Вставить("ВладелецДополнительныхЗначений", Элементы.Свойства.ТекущиеДанные.ВладелецДополнительныхЗначений);
	
	Элементы.ВставитьРеквизит.Доступность = Не ПоказатьНеиспользуемыеРеквизиты;
КонецПроцедуры

&НаКлиенте
Процедура ВставитьРеквизит(Команда)
	Если КопируемыйРеквизит.ОбщиеЗначения Тогда
		ВладелецДополнительныхЗначений = КопируемыйРеквизит.ВладелецДополнительныхЗначений;
	Иначе
		ВладелецДополнительныхЗначений = КопируемыйРеквизит.КопируемыйРеквизит;
	КонецЕсли;
	
	ДобавитьРеквизитВНабор(ВладелецДополнительныхЗначений);
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура ОформитьНаборыИСвойства()
	
	НаборыСвойств.УсловноеОформление.Элементы.Очистить();
	
	// Оформление корня списка наборов.
	ЭлементУсловногоОформления = НаборыСвойств.УсловноеОформление.Элементы.Добавить();
	
	ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("Text");
	ЭлементЦветаОформления.Значение = НСтр("ru = 'Наборы'");
	ЭлементЦветаОформления.Использование = Истина;
	
	ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбораДанных.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Ссылка");
	ЭлементОтбораДанных.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеЗаполнено;
	ЭлементОтбораДанных.Использование  = Истина;
	
	ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("Представление");
	ЭлементОформляемогоПоля.Использование = Истина;
	
	// Оформление недоступных групп наборов, которые безусловно отображаются платформой, как часть дерева групп.
	ЭлементУсловногоОформления = НаборыСвойств.УсловноеОформление.Элементы.Добавить();
	
	ЭлементВидимость = ЭлементУсловногоОформления.Оформление.Элементы.Найти("Видимость");
	ЭлементВидимость.Значение = Ложь;
	ЭлементВидимость.Использование = Истина;
	
	ГруппаЭлементовОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаЭлементовОтбораДанных.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
	ГруппаЭлементовОтбораДанных.Использование = Истина;
	
	ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбораДанных.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Ссылка");
	ЭлементОтбораДанных.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеВСписке;
	ЭлементОтбораДанных.ПравоеЗначение = ДоступныеНаборыСписок;
	ЭлементОтбораДанных.Использование  = Истина;
	
	ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбораДанных.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Родитель");
	ЭлементОтбораДанных.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеВСписке;
	ЭлементОтбораДанных.ПравоеЗначение = ДоступныеНаборыСписок;
	ЭлементОтбораДанных.Использование  = Истина;
	
	ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбораДанных.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Ссылка");
	ЭлементОтбораДанных.ВидСравнения   = ВидСравненияКомпоновкиДанных.Заполнено;
	ЭлементОтбораДанных.Использование  = Истина;
	
	ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("Представление");
	ЭлементОформляемогоПоля.Использование = Истина;
	
	УсловноеОформление.Элементы.Очистить();
	
	// Оформление свойств, обязательных для заполнения.
	ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
	
	ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("Font");
	ЭлементЦветаОформления.Значение = ШрифтыСтиля.ОсновнойЭлементСписка;
	ЭлементЦветаОформления.Использование = Истина;
	
	ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбораДанных.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Свойства.ЗаполнятьОбязательно");
	ЭлементОтбораДанных.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбораДанных.ПравоеЗначение = Истина;
	ЭлементОтбораДанных.Использование  = Истина;
	
	ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("СвойстваЗаголовок");
	ЭлементОформляемогоПоля.Использование = Истина;
	
	// Оформление свойств, обязательных для заполнения.
	ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
	ЭлементВидимость = ЭлементУсловногоОформления.Оформление.Элементы.Найти("Видимость");
	ЭлементВидимость.Значение = Ложь;
	ЭлементВидимость.Использование = Истина; 
	
	ГруппаЭлементовОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаЭлементовОтбораДанных.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
	ГруппаЭлементовОтбораДанных.Использование = Истина;
	
	ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбораДанных.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ПолеПоиска");
	ЭлементОтбораДанных.ВидСравнения   = ВидСравненияКомпоновкиДанных.Заполнено;
	ЭлементОтбораДанных.Использование  = Истина;
	
	ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбораДанных.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("НаборыСвойств.Представление");
	ЭлементОтбораДанных.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеСодержит;
	ЭлементОтбораДанных.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ПолеПоиска");
	ЭлементОтбораДанных.Использование  = Истина; 
	
	ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("Представление");
	ЭлементОформляемогоПоля.Использование = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьУказанныеСтроки(Описание)
	
	Если Описание.Свойство("Набор") Тогда
		
		Если ТипЗнч(Описание.Набор) = Тип("Строка") Тогда
			ПреобразоватьСтрокиВСсылки(Описание);
		КонецЕсли;
		
		Если Описание.ВидСвойств <> ВидСвойств Тогда
			ВидСвойств = Описание.ВидСвойств;
			НастроитьОтображениеНаборов();
		КонецЕсли;
		
		Элементы.НаборыСвойств.ТекущаяСтрока = Описание.Набор;
		ТекущийНабор = Неопределено;
		ПриИзмененииТекущегоНабора();
		НайденныеСтроки = Свойства.НайтиСтроки(Новый Структура("Свойство", Описание.Свойство));
		Если НайденныеСтроки.Количество() > 0 Тогда
			Элементы.Свойства.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор();
		Иначе
			Элементы.Свойства.ТекущаяСтрока = Неопределено;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПереключитьСписокНаборов()
	
	Если Не ПоказатьНеиспользуемыеРеквизиты Тогда
		Элементы.СтраницыНаборы.ТекущаяСтраница = Элементы.Основная;
		Возврат;
	КонецЕсли;
	
	Элементы.СтраницыНаборы.ТекущаяСтраница = Элементы.Неиспользуемые;
	
	ПредставлениеСписка = "";
	Если ВидСвойств = ПредопределенноеЗначение("Перечисление.ВидыСвойств.ДополнительныеСведения") Тогда
		ПредставлениеСписка = НСтр("ru = 'Неиспользуемые дополнительные сведения'");
	ИначеЕсли ВидСвойств = ПредопределенноеЗначение("Перечисление.ВидыСвойств.ДополнительныеРеквизиты") Тогда
		ПредставлениеСписка = НСтр("ru = 'Неиспользуемые дополнительные реквизиты'");
	ИначеЕсли ВидСвойств = ПредопределенноеЗначение("Перечисление.ВидыСвойств.Метки") Тогда
		ПредставлениеСписка = НСтр("ru = 'Неиспользуемые метки'");
	КонецЕсли;
	
	ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(
		НеиспользуемыеНаборы, "ПредставлениеСписка", ПредставлениеСписка, Истина);
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПреобразоватьСтрокиВСсылки(Описание)
	
	Описание.Вставить("Набор", Справочники.НаборыДополнительныхРеквизитовИСведений.ПолучитьСсылку(
		Новый УникальныйИдентификатор(Описание.Набор)));
	
	Описание.Вставить("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолучитьСсылку(
		Новый УникальныйИдентификатор(Описание.Свойство)));
	
КонецПроцедуры

&НаСервере
Процедура НастроитьОтображениеНаборов()
	
	КомандаСоздать                      = Команды.Найти("Создать");
	КомандаСкопировать                  = Команды.Найти("Скопировать");
	КомандаИзменить                     = Команды.Найти("Изменить");
	КомандаПометитьНаУдаление           = Команды.Найти("ПометитьНаУдаление");
	КомандаПереместитьВверх             = Команды.Найти("ПереместитьВверх");
	КомандаПереместитьВниз              = Команды.Найти("ПереместитьВниз");
	
	Если ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеСведения Тогда
		Заголовок = НСтр("ru = 'Дополнительные сведения'");
		
		КомандаСоздать.Подсказка          = НСтр("ru = 'Создать уникальное сведение'");
		КомандаСоздать.Заголовок          = НСтр("ru = 'Новое'");
		КомандаСоздать.Подсказка          = НСтр("ru = 'Создать уникальное сведение'");
		
		КомандаСкопировать.Подсказка        = НСтр("ru = 'Создать новое сведение копированием текущего'");
		КомандаИзменить.Подсказка           = НСтр("ru = 'Изменить (или открыть) текущее сведение'");
		КомандаПометитьНаУдаление.Подсказка = НСтр("ru = 'Пометить текущее сведение на удаление (Del)'");
		КомандаПереместитьВверх.Подсказка   = НСтр("ru = 'Переместить текущее сведение вверх'");
		КомандаПереместитьВниз.Подсказка    = НСтр("ru = 'Переместить текущее сведение вниз'");
		
		МетаданныеТабличнаяЧасть =
			Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ТабличныеЧасти.ДополнительныеСведения;
		
		Элементы.СвойстваЗаголовок.Подсказка = МетаданныеТабличнаяЧасть.Реквизиты.Свойство.Подсказка;
		
		Элементы.СвойстваЗаполнятьОбязательно.Видимость = Ложь;
		
		Элементы.СвойстваТипЗначения.Подсказка =
			НСтр("ru = 'Типы значения, которое можно ввести при заполнении сведения.'");
		
		Элементы.СвойстваОбщиеЗначения.Подсказка =
			НСтр("ru = 'Сведение использует список значений сведения-образца.'");
		
		Элементы.ПоказатьНеиспользуемыеРеквизиты.Заголовок = НСтр("ru = 'Показать неиспользуемые сведения'");
		
		Элементы.СвойстваОбщее.Заголовок = НСтр("ru = 'Общее'");
		Элементы.СвойстваОбщее.Подсказка = НСтр("ru = 'Общее дополнительное сведение, которое используется в
		                                              |нескольких наборах дополнительных сведений.'");
	ИначеЕсли ВидСвойств = Перечисления.ВидыСвойств.Метки Тогда
		Заголовок = НСтр("ru = 'Метки'");
		КомандаСоздать.Заголовок          = НСтр("ru = 'Новая'");
		КомандаСоздать.Подсказка          = НСтр("ru = 'Создать уникальную метку'");
		
		КомандаСкопировать.Подсказка        = НСтр("ru = 'Создать новую метку копированием текущей'");
		КомандаИзменить.Подсказка           = НСтр("ru = 'Изменить (или открыть) текущую метку'");
		КомандаПометитьНаУдаление.Подсказка = НСтр("ru = 'Пометить текущую метку на удаление (Del)'");
		КомандаПереместитьВверх.Подсказка   = НСтр("ru = 'Переместить текущую метку вверх'");
		КомандаПереместитьВниз.Подсказка    = НСтр("ru = 'Переместить текущую метку вниз'");
		
		МетаданныеТабличнаяЧасть =
			Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ТабличныеЧасти.ДополнительныеРеквизиты;
		
		Элементы.СвойстваЗаголовок.Подсказка = МетаданныеТабличнаяЧасть.Реквизиты.Свойство.Подсказка;
		
		Элементы.СвойстваЗаполнятьОбязательно.Видимость = Истина;
		Элементы.СвойстваЗаполнятьОбязательно.Подсказка =
			Метаданные.ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.Реквизиты.ЗаполнятьОбязательно.Подсказка;
		
		Элементы.СвойстваТипЗначения.Подсказка =
			НСтр("ru = 'Типы значения, которое можно ввести при заполнении метки.'");
		
		Элементы.СвойстваОбщиеЗначения.Подсказка =
			НСтр("ru = 'Метка использует список значений метки-образца.'");
		
		Элементы.ПоказатьНеиспользуемыеРеквизиты.Заголовок = НСтр("ru = 'Показать неиспользуемые метки'");
		
		Элементы.СвойстваОбщее.Заголовок = НСтр("ru = 'Общая'");
		Элементы.СвойстваОбщее.Подсказка = НСтр("ru = 'Общая метка, которая используется в
		                                              |нескольких наборах меток.'");
		Элементы.Свойства.Шапка = Ложь;
		Элементы.СвойстваТипЗначения.Видимость = Ложь;
	Иначе
		Заголовок = НСтр("ru = 'Дополнительные реквизиты'");
		КомандаСоздать.Заголовок          = НСтр("ru = 'Новый'");
		КомандаСоздать.Подсказка          = НСтр("ru = 'Создать уникальный реквизит'");
		
		КомандаСкопировать.Подсказка        = НСтр("ru = 'Создать новый реквизит копированием текущего'");
		КомандаИзменить.Подсказка           = НСтр("ru = 'Изменить (или открыть) текущий реквизит'");
		КомандаПометитьНаУдаление.Подсказка = НСтр("ru = 'Пометить текущий реквизит на удаление (Del)'");
		КомандаПереместитьВверх.Подсказка   = НСтр("ru = 'Переместить текущий реквизит вверх'");
		КомандаПереместитьВниз.Подсказка    = НСтр("ru = 'Переместить текущий реквизит вниз'");
		
		МетаданныеТабличнаяЧасть =
			Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ТабличныеЧасти.ДополнительныеРеквизиты;
		
		Элементы.СвойстваЗаголовок.Подсказка = МетаданныеТабличнаяЧасть.Реквизиты.Свойство.Подсказка;
		
		Элементы.СвойстваЗаполнятьОбязательно.Видимость = Истина;
		Элементы.СвойстваЗаполнятьОбязательно.Подсказка =
			Метаданные.ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.Реквизиты.ЗаполнятьОбязательно.Подсказка;
		
		Элементы.СвойстваТипЗначения.Подсказка =
			НСтр("ru = 'Типы значения, которое можно ввести при заполнении реквизита.'");
		
		Элементы.СвойстваОбщиеЗначения.Подсказка =
			НСтр("ru = 'Реквизит использует список значений реквизита-образца.'");
		
		Элементы.ПоказатьНеиспользуемыеРеквизиты.Заголовок = НСтр("ru = 'Показать неиспользуемые реквизиты'");
		
		Элементы.СвойстваОбщее.Заголовок = НСтр("ru = 'Общий'");
		Элементы.СвойстваОбщее.Подсказка = НСтр("ru = 'Общий дополнительный реквизит, который используется в
		                                              |нескольких наборах дополнительных реквизитов.'");
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Наборы.Ссылка КАК Ссылка,
	|	Наборы.ПометкаУдаления КАК ПометкаУдаления,
	|	Наборы.Предопределенный КАК Предопределенный,
	|	Наборы.ЭтоГруппа КАК ЭтоГруппа,
	|	Наборы.Родитель КАК Родитель,
	|	Наборы.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
	|	Наборы.ИмяПредопределенногоНабора КАК ИмяПредопределенногоНабора
	|ИЗ
	|	Справочник.НаборыДополнительныхРеквизитовИСведений КАК Наборы
	|ГДЕ
	|	Наборы.Родитель = ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка)";
	
	Наборы = Запрос.Выполнить().Выгрузить();
	ДоступныеНаборы = Новый Массив;
	ДоступныеНаборыСписок.Очистить();
	
	СвойстваНабора = Новый Структура;
	СвойстваНабора.Вставить("ПометкаУдаления");
	СвойстваНабора.Вставить("Предопределенный");
	СвойстваНабора.Вставить("ЭтоГруппа");
	СвойстваНабора.Вставить("Родитель");
	СвойстваНабора.Вставить("ИмяПредопределенныхДанных");
	СвойстваНабора.Вставить("ИмяПредопределенногоНабора");
	
	Для Каждого Строка Из Наборы Цикл
		Если СтрНачинаетсяС(Строка.ИмяПредопределенныхДанных, "Удалить") Тогда
			Продолжить;
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(СвойстваНабора, Строка);
		
		ВидыСвойствНабора = УправлениеСвойствамиСлужебный.ВидыСвойствНабора(СвойстваНабора, Ложь);
		
		Если ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеСведения И ВидыСвойствНабора.ДополнительныеСведения
			ИЛИ ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеРеквизиты И ВидыСвойствНабора.ДополнительныеРеквизиты
			ИЛИ ВидСвойств = Перечисления.ВидыСвойств.Метки И ВидыСвойствНабора.Метки Тогда
			ДоступныеНаборы.Добавить(Строка.Ссылка);
			ДоступныеНаборыСписок.Добавить(Строка.Ссылка);
		КонецЕсли;
	КонецЦикла;
	
	ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(
		НаборыСвойств, "ВидСвойств", ВидСвойств, Истина);
	
	ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(
		НаборыСвойств, "Наборы", ДоступныеНаборы, Истина);
	
	ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(
		НаборыСвойств, "КодЯзыка", ТекущийЯзык().КодЯзыка, Истина);
	
	ПриИзмененииТекущегоНабораНаСервере();
	
КонецПроцедуры
	
&НаКлиенте
Процедура ПриИзмененииТекущегоНабора()
	
	Если ПоказатьНеиспользуемыеРеквизиты Тогда
		ТекущийНабор = Неопределено;
		ПриИзмененииТекущегоНабораНаСервере();
	ИначеЕсли Элементы.НаборыСвойств.ТекущиеДанные = Неопределено Тогда
		Если ЗначениеЗаполнено(ТекущийНабор) Тогда
			ТекущийНабор = Неопределено;
			ПриИзмененииТекущегоНабораНаСервере();
		КонецЕсли;
		
	ИначеЕсли Элементы.НаборыСвойств.ТекущиеДанные.Ссылка <> ТекущийНабор Тогда
		ТекущийНабор          = Элементы.НаборыСвойств.ТекущиеДанные.Ссылка;
		ТекущийНаборЭтоГруппа = Элементы.НаборыСвойств.ТекущиеДанные.ЭтоГруппа;
		ПриИзмененииТекущегоНабораНаСервере();
	КонецЕсли;
	
#Если МобильныйКлиент Тогда
	ТекущийЭлемент = Элементы.Свойства;
	Если Не ВажностьУстановлена Тогда
		Элементы.НаборыСвойств.ВажностьПриОтображении = ВажностьПриОтображении.ОченьНизкая;
		ВажностьУстановлена = Истина;
	КонецЕсли;
	Элементы.Свойства.Заголовок = Строка(ТекущийНабор);
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьПометкуУдаления()
	
	Если Элементы.Свойства.ТекущиеДанные <> Неопределено Тогда
		
		Если ВидСвойств = ПредопределенноеЗначение("Перечисление.ВидыСвойств.ДополнительныеСведения") Тогда
			Если Не ПоказатьНеиспользуемыеРеквизиты Тогда
				ТекстВопроса = НСтр("ru = 'Исключить сведение из набора?'");
				
			ИначеЕсли Элементы.Свойства.ТекущиеДанные.ПометкаУдаления Тогда
				ТекстВопроса = НСтр("ru = 'Снять с текущего сведения пометку на удаление?'");
			Иначе
				ТекстВопроса = НСтр("ru = 'Пометить текущее сведение на удаление?'");
			КонецЕсли;
		ИначеЕсли ВидСвойств = ПредопределенноеЗначение("Перечисление.ВидыСвойств.ДополнительныеРеквизиты") Тогда
			Если Не ПоказатьНеиспользуемыеРеквизиты Тогда
				ТекстВопроса = НСтр("ru = 'Исключить реквизит из набора?'");
				
			ИначеЕсли Элементы.Свойства.ТекущиеДанные.ПометкаУдаления Тогда
				ТекстВопроса = НСтр("ru = 'Снять с текущего реквизита пометку на удаление?'");
			Иначе
				ТекстВопроса = НСтр("ru = 'Пометить текущий реквизит на удаление?'");
			КонецЕсли;
		ИначеЕсли ВидСвойств = ПредопределенноеЗначение("Перечисление.ВидыСвойств.Метки") Тогда
			Если Не ПоказатьНеиспользуемыеРеквизиты Тогда
				ТекстВопроса = НСтр("ru = 'Исключить метку из набора?'");
				
			ИначеЕсли Элементы.Свойства.ТекущиеДанные.ПометкаУдаления Тогда
				ТекстВопроса = НСтр("ru = 'Снять с текущей метки пометку на удаление?'");
			Иначе
				ТекстВопроса = НСтр("ru = 'Пометить текущую метку на удаление?'");
			КонецЕсли;
		КонецЕсли;
		
		ПоказатьВопрос(
			Новый ОписаниеОповещения("ИзменитьПометкуУдаленияЗавершение", ЭтотОбъект, ТекущийНабор),
			ТекстВопроса, РежимДиалогаВопрос.ДаНет);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьПометкуУдаленияЗавершение(Ответ, ТекущийНабор) Экспорт
	
	Если Ответ <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	ВыполнитьКомандуНаСервере("ИзменитьПометкуУдаления");
	
	Оповестить("Запись_НаборыДополнительныхРеквизитовИСведений",
		Новый Структура("Ссылка", ТекущийНабор), ТекущийНабор);
	
КонецПроцедуры

&НаСервере
Процедура ПриИзмененииТекущегоНабораНаСервере()
	
	Если ЗначениеЗаполнено(ТекущийНабор)
	   И НЕ ТекущийНаборЭтоГруппа
	   Или ПоказатьНеиспользуемыеРеквизиты Тогда
		
		ТекущаяДоступность = Истина;
		Если Элементы.Свойства.ЦветФона <> Элементы.НаборыСвойств.ЦветФона Тогда
			Элементы.Свойства.ЦветФона = Элементы.НаборыСвойств.ЦветФона;
		КонецЕсли;
		УправлениеСвойствамиСлужебный.ОбновитьСписокСвойствТекущегоНабора(ЭтотОбъект, 
			ТекущийНабор,
			ВидСвойств,
			ТекущаяДоступность);
	Иначе
		ТекущаяДоступность = Ложь;
		Если Элементы.Свойства.ЦветФона <> ЦветФормы Тогда
			Элементы.Свойства.ЦветФона = ЦветФормы;
		КонецЕсли;
		Свойства.Очистить();
	КонецЕсли;
	
	Если Элементы.Свойства.ТолькоПросмотр = ТекущаяДоступность Тогда
		Элементы.Свойства.ТолькоПросмотр = НЕ ТекущаяДоступность;
	КонецЕсли;
	
	СвойстваУстановитьДоступностьКоманд(ЭтотОбъект);
	
	Элементы.НаборыСвойств.Обновить();
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура СвойстваУстановитьДоступностьКоманд(Контекст)
	
	Элементы = Контекст.Элементы;
	ПоказатьНеиспользуемыеРеквизиты = Контекст.ПоказатьНеиспользуемыеРеквизиты;
	
	ОбщаяДоступность = НЕ Элементы.Свойства.ТолькоПросмотр;
	ДоступностьВставки = ОбщаяДоступность И (Контекст.КопируемыйРеквизит <> Неопределено);
	
	ДоступностьДляСтроки = ОбщаяДоступность
		И Контекст.Элементы.Свойства.ТекущаяСтрока <> Неопределено;
	
	ОбщаяДоступность = ОбщаяДоступность И Не ПоказатьНеиспользуемыеРеквизиты;
	
	// Настройка команд командной панели.
	Элементы.ДобавитьИзНабора.Доступность           = ОбщаяДоступность;
	Элементы.СвойстваСоздать.Доступность            = ОбщаяДоступность;
	
	Элементы.СвойстваСкопировать.Доступность        = ДоступностьДляСтроки И Не ПоказатьНеиспользуемыеРеквизиты;
	Элементы.СвойстваИзменить.Доступность           = ДоступностьДляСтроки;
	Элементы.СвойстваПометитьНаУдаление.Доступность = ДоступностьДляСтроки;
	
	Элементы.СвойстваПереместитьВверх.Доступность   = ДоступностьДляСтроки;
	Элементы.СвойстваПереместитьВниз.Доступность    = ДоступностьДляСтроки;
	
	Элементы.КопироватьРеквизит.Доступность         = ДоступностьДляСтроки;
	Элементы.ВставитьРеквизит.Доступность           = ДоступностьВставки И Не ПоказатьНеиспользуемыеРеквизиты;
	
	// Настройка команд контекстного меню.
	Элементы.СвойстваКонтекстноеМенюСоздать.Доступность            = ОбщаяДоступность;
	Элементы.СвойстваКонтекстноеМенюДобавитьИзНабора.Доступность   = ОбщаяДоступность;
	
	Элементы.СвойстваКонтекстноеМенюСкопировать.Доступность        = ДоступностьДляСтроки И Не ПоказатьНеиспользуемыеРеквизиты;
	Элементы.СвойстваКонтекстноеМенюИзменить.Доступность           = ДоступностьДляСтроки;
	Элементы.СвойстваКонтекстноеМенюПометитьНаУдаление.Доступность = ДоступностьДляСтроки;
	
	Элементы.СвойстваКонтекстноеМенюКопироватьРеквизит.Доступность = ДоступностьДляСтроки;
	Элементы.СвойстваКонтекстноеМенюВставитьРеквизит.Доступность   = ДоступностьВставки И Не ПоказатьНеиспользуемыеРеквизиты;
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьОбщееСвойствоПеретаскиванием(ДобавляемоеСвойство)
	
	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений");
	ЭлементБлокировки.УстановитьЗначение("Ссылка", НаборПриемник);
	
	Попытка
		ЗаблокироватьДанныеДляРедактирования(НаборПриемник);
		НачатьТранзакцию();
		Попытка
			Блокировка.Заблокировать();
			ЗаблокироватьДанныеДляРедактирования(НаборПриемник);
			
			НаборПриемникОбъект = НаборПриемник.ПолучитьОбъект();
			
			Если ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеРеквизиты
				Или ВидСвойств = Перечисления.ВидыСвойств.Метки Тогда
				ВидСвойствИмя = "ДополнительныеРеквизиты"; 
			ИначеЕсли ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеСведения Тогда
				ВидСвойствИмя = "ДополнительныеСведения";
			КонецЕсли;
			ТабличнаяЧасть = НаборПриемникОбъект[ВидСвойствИмя];
			
			НайденнаяСтрока = ТабличнаяЧасть.Найти(ДобавляемоеСвойство, "Свойство");
			
			Если НайденнаяСтрока = Неопределено Тогда
				НоваяСтрока = ТабличнаяЧасть.Добавить();
				НоваяСтрока.Свойство = ДобавляемоеСвойство;
				НаборПриемникОбъект.Записать();
				
			ИначеЕсли НайденнаяСтрока.ПометкаУдаления Тогда
				НайденнаяСтрока.ПометкаУдаления = Ложь;
				НаборПриемникОбъект.Записать();
			КонецЕсли;
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;
	Исключение
		РазблокироватьДанныеДляРедактирования(НаборПриемник);
		ВызватьИсключение;
	КонецПопытки;
	
	Элементы.НаборыСвойств.Обновить();
	НаборПриемник = Неопределено;
	
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(Команда, Параметр = Неопределено)
	
	Блокировка = Новый БлокировкаДанных;
	
	Если Команда = "ИзменитьПометкуУдаления" Тогда
		ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений");
		ЭлементБлокировки = Блокировка.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения");
		ЭлементБлокировки = Блокировка.Добавить("Справочник.ЗначенияСвойствОбъектов");
		ЭлементБлокировки = Блокировка.Добавить("Справочник.ЗначенияСвойствОбъектовИерархия");
	Иначе
		ЭлементБлокировки = Блокировка.Добавить("Справочник.НаборыДополнительныхРеквизитовИСведений");
		ЭлементБлокировки.УстановитьЗначение("Ссылка", ТекущийНабор);
	КонецЕсли;
	
	Если ПоказатьНеиспользуемыеРеквизиты Тогда
		НачатьТранзакцию();
		Попытка
			Блокировка.Заблокировать();
			
			Строка = Свойства.НайтиПоИдентификатору(Элементы.Свойства.ТекущаяСтрока);
			ИзменитьПометкуУдаленияИВладельцаЗначений(Строка.Свойство, Неопределено);
			ПриИзмененииТекущегоНабораНаСервере();
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;
		
		Возврат;
	КонецЕсли;
	
	Попытка
		ЗаблокироватьДанныеДляРедактирования(ТекущийНабор);
		НачатьТранзакцию();
		Попытка
			Блокировка.Заблокировать();
			ЗаблокироватьДанныеДляРедактирования(ТекущийНабор);
			
			ТекущийНаборОбъект = ТекущийНабор.ПолучитьОбъект();
			Если ТекущийНаборОбъект.ВерсияДанных <> ТекущийНаборВерсияДанных Тогда
				ПриИзмененииТекущегоНабораНаСервере();
				Если ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеСведения Тогда
					ВызватьИсключение
						НСтр("ru = 'Действие не выполнено, так как состав дополнительных сведений
						           |был изменен другим пользователем.
						           |Новый состав дополнительных сведений прочитан.
						           |
						           |Повторите действие, если требуется.'");
				ИначеЕсли ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеРеквизиты Тогда
					ВызватьИсключение
						НСтр("ru = 'Действие не выполнено, так как состав дополнительных реквизитов
						           |был изменен другим пользователем.
						           |Новый состав дополнительных реквизитов прочитан.
						           |
						           |Повторите действие, если требуется.'");
				ИначеЕсли ВидСвойств = Перечисления.ВидыСвойств.Метки Тогда
					ВызватьИсключение
						НСтр("ru = 'Действие не выполнено, так как состав меток
						           |был изменен другим пользователем.
						           |Новый состав меток прочитан.
						           |
						           |Повторите действие, если требуется.'");
				КонецЕсли;
			КонецЕсли;
			
			Если ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеСведения Тогда
				ВидСвойствИмя = "ДополнительныеСведения";
			Иначе
				ВидСвойствИмя = "ДополнительныеРеквизиты";
			КонецЕсли;
			ТабличнаяЧасть = ТекущийНаборОбъект[ВидСвойствИмя];
			
			Если Команда = "ДобавитьОбщееСвойство" Тогда
				НайденнаяСтрока = ТабличнаяЧасть.Найти(Параметр, "Свойство");
				
				Если НайденнаяСтрока = Неопределено Тогда
					НоваяСтрока = ТабличнаяЧасть.Добавить();
					НоваяСтрока.Свойство = Параметр;
					ТекущийНаборОбъект.Записать();
					
				ИначеЕсли НайденнаяСтрока.ПометкаУдаления Тогда
					НайденнаяСтрока.ПометкаУдаления = Ложь;
					ТекущийНаборОбъект.Записать();
				КонецЕсли;
			Иначе
				Строка = Свойства.НайтиПоИдентификатору(Элементы.Свойства.ТекущаяСтрока);
				
				Если Строка <> Неопределено Тогда
					Индекс = Строка.НомерСтроки-1;
					
					Если Команда = "ПереместитьВверх" Тогда
						ИндексВерхнейСтроки = Свойства.Индекс(Строка)-1;
						Если ИндексВерхнейСтроки >= 0 Тогда
							Сдвиг = Свойства[ИндексВерхнейСтроки].НомерСтроки - Строка.НомерСтроки;
							ТабличнаяЧасть.Сдвинуть(Индекс, Сдвиг);
						КонецЕсли;
						ТекущийНаборОбъект.Записать();
						
					ИначеЕсли Команда = "ПереместитьВниз" Тогда
						ИндексНижнейСтроки = Свойства.Индекс(Строка)+1;
						Если ИндексНижнейСтроки < Свойства.Количество() Тогда
							Сдвиг = Свойства[ИндексНижнейСтроки].НомерСтроки - Строка.НомерСтроки;
							ТабличнаяЧасть.Сдвинуть(Индекс, Сдвиг);
						КонецЕсли;
						ТекущийНаборОбъект.Записать();
						
					ИначеЕсли Команда = "ИзменитьПометкуУдаления" Тогда
						Строка = Свойства.НайтиПоИдентификатору(Элементы.Свойства.ТекущаяСтрока);
						
						Если Строка.Общее Тогда
							ТабличнаяЧасть.Удалить(Индекс);
							ТекущийНаборОбъект.Записать();
							Свойства.Удалить(Строка);
						Иначе
							ТабличнаяЧасть[Индекс].ПометкаУдаления = НЕ ТабличнаяЧасть[Индекс].ПометкаУдаления;
							ТекущийНаборОбъект.Записать();
							
							ИзменитьПометкуУдаленияИВладельцаЗначений(
								ТабличнаяЧасть[Индекс].Свойство,
								ТабличнаяЧасть[Индекс].ПометкаУдаления);
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ВызватьИсключение;
		КонецПопытки;
	Исключение
		РазблокироватьДанныеДляРедактирования(ТекущийНабор);
		ВызватьИсключение;
	КонецПопытки;
	
	ПриИзмененииТекущегоНабораНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ИзменитьПометкуУдаленияИВладельцаЗначений(ТекущееСвойство, ПометкаУдаленияСвойства)
	
	СтарыйВладелецЗначений = ТекущееСвойство;
	
	НоваяПометкаЗначений   = Неопределено;
	НовыйВладелецЗначений  = Неопределено;
	
	СвойствоОбъект = ТекущееСвойство.ПолучитьОбъект();
	
	Если ПометкаУдаленияСвойства = Неопределено Тогда
		ПометкаУдаленияСвойства = Не СвойствоОбъект.ПометкаУдаления;
	КонецЕсли;
	
	Если ПометкаУдаленияСвойства Тогда
		// При пометке уникального свойства:
		// - пометить свойство,
		// - если есть созданные по образцу не помеченные на удаление
		//   тогда установить нового владельца значений,
		//   и всем свойствам указать новый образец,
		//   иначе пометить на удаление все значения.
		СвойствоОбъект.ПометкаУдаления = Истина;
		
		Если НЕ ЗначениеЗаполнено(СвойствоОбъект.ВладелецДополнительныхЗначений) Тогда
			Запрос = Новый Запрос;
			Запрос.УстановитьПараметр("Свойство", СвойствоОбъект.Ссылка);
			Запрос.Текст =
			"ВЫБРАТЬ
			|	Свойства.Ссылка,
			|	Свойства.ПометкаУдаления
			|ИЗ
			|	ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства
			|ГДЕ
			|	Свойства.ВладелецДополнительныхЗначений = &Свойство";
			Выгрузка = Запрос.Выполнить().Выгрузить();
			НайденнаяСтрока = Выгрузка.Найти(Ложь, "ПометкаУдаления");
			Если НайденнаяСтрока <> Неопределено Тогда
				НовыйВладелецЗначений  = НайденнаяСтрока.Ссылка;
				СвойствоОбъект.ВладелецДополнительныхЗначений = НовыйВладелецЗначений;
				Для каждого Строка Из Выгрузка Цикл
					ТекущийОбъект = Строка.Ссылка.ПолучитьОбъект();
					Если ТекущийОбъект.Ссылка = НовыйВладелецЗначений Тогда
						ТекущийОбъект.ВладелецДополнительныхЗначений = Неопределено;
					Иначе
						ТекущийОбъект.ВладелецДополнительныхЗначений = НовыйВладелецЗначений;
					КонецЕсли;
					ТекущийОбъект.Записать();
				КонецЦикла;
			Иначе
				НоваяПометкаЗначений = Истина;
			КонецЕсли;
		КонецЕсли;
		СвойствоОбъект.Записать();
	Иначе
		Если СвойствоОбъект.ПометкаУдаления Тогда
			СвойствоОбъект.ПометкаУдаления = Ложь;
			СвойствоОбъект.Записать();
		КонецЕсли;
		// При снятии пометки с уникального свойства:
		// - снять пометку со свойства,
		// - если свойство создано по образцу
		//   тогда если образец помечен на удаление
		//     тогда установить нового владельца значений (текущего)
		//     для всех свойств и снять пометку удаления со значений
		//   иначе снять пометку удаления со значений.
		Если НЕ ЗначениеЗаполнено(СвойствоОбъект.ВладелецДополнительныхЗначений) Тогда
			НоваяПометкаЗначений = Ложь;
			
		ИначеЕсли ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
		            СвойствоОбъект.ВладелецДополнительныхЗначений, "ПометкаУдаления") Тогда
			
			Запрос = Новый Запрос;
			Запрос.УстановитьПараметр("Свойство", СвойствоОбъект.ВладелецДополнительныхЗначений);
			Запрос.Текст =
			"ВЫБРАТЬ
			|	Свойства.Ссылка КАК Ссылка
			|ИЗ
			|	ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства
			|ГДЕ
			|	Свойства.ВладелецДополнительныхЗначений = &Свойство";
			Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
			Массив.Добавить(СвойствоОбъект.ВладелецДополнительныхЗначений);
			НовыйВладелецЗначений = СвойствоОбъект.Ссылка;
			Для каждого ТекущаяСсылка Из Массив Цикл
				Если ТекущаяСсылка = НовыйВладелецЗначений Тогда
					Продолжить;
				КонецЕсли;
				ТекущийОбъект = ТекущаяСсылка.ПолучитьОбъект();
				ТекущийОбъект.ВладелецДополнительныхЗначений = НовыйВладелецЗначений;
				ТекущийОбъект.Записать();
			КонецЦикла;
			СтарыйВладелецЗначений = СвойствоОбъект.ВладелецДополнительныхЗначений;
			СвойствоОбъект.ВладелецДополнительныхЗначений = Неопределено;
			СвойствоОбъект.Записать();
			НоваяПометкаЗначений = Ложь;
		КонецЕсли;
	КонецЕсли;
	
	Если НоваяПометкаЗначений  = Неопределено
	   И НовыйВладелецЗначений = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Владелец", СтарыйВладелецЗначений);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ЗначенияСвойствОбъектов.Ссылка КАК Ссылка,
	|	ЗначенияСвойствОбъектов.ПометкаУдаления КАК ПометкаУдаления
	|ИЗ
	|	Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
	|ГДЕ
	|	ЗначенияСвойствОбъектов.Владелец = &Владелец
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ЗначенияСвойствОбъектовИерархия.Ссылка,
	|	ЗначенияСвойствОбъектовИерархия.ПометкаУдаления
	|ИЗ
	|	Справочник.ЗначенияСвойствОбъектовИерархия КАК ЗначенияСвойствОбъектовИерархия
	|ГДЕ
	|	ЗначенияСвойствОбъектовИерархия.Владелец = &Владелец";
	
	Выгрузка = Запрос.Выполнить().Выгрузить();
	
	Если НовыйВладелецЗначений <> Неопределено Тогда
		Для каждого Строка Из Выгрузка Цикл
			ТекущийОбъект = Строка.Ссылка.ПолучитьОбъект();
			
			Если ТекущийОбъект.Владелец <> НовыйВладелецЗначений Тогда
				ТекущийОбъект.Владелец = НовыйВладелецЗначений;
			КонецЕсли;
			
			Если ТекущийОбъект.Модифицированность() Тогда
				ТекущийОбъект.ОбменДанными.Загрузка = Истина;
				ТекущийОбъект.Записать();
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Если НоваяПометкаЗначений <> Неопределено Тогда
		Для каждого Строка Из Выгрузка Цикл
			ТекущийОбъект = Строка.Ссылка.ПолучитьОбъект();
			
			Если ТекущийОбъект.ПометкаУдаления <> НоваяПометкаЗначений Тогда
				ТекущийОбъект.ПометкаУдаления = НоваяПометкаЗначений;
			КонецЕсли;
			
			Если ТекущийОбъект.Модифицированность() Тогда
				ТекущийОбъект.Записать();
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти
